package Negocio;

import java.util.ArrayList;
import java.util.Collection;

import erro.ConexaoException;
import erro.NegocioException;
import erro.RepositorioException;
import ClassesBasicas.Componente;
import Repositorio.RepComponente;

/**
 * Classe que define uma regra de negocio 
 * para um componente e suas validacoes. 
 * 
 * @author Esdras
 *
 */
public class NegocioComponente {


		private RepComponente repcomp;
		
		public NegocioComponente(){
			repcomp = new RepComponente();
		}
		/**
		 * Valida se Existe um Componente
		 * 
		 * @param compo
		 * @return
		 * @throws NegocioException
		 */
		public boolean existComp(Componente compo)throws NegocioException{
			Componente comp = new Componente();
			
			comp = consultar(compo.getNomeComponente());
			
			if(comp == null){
				return false;
			}
			return true;
			
		}
		/**
		 * Valida os caompos do componente e salva
		 * 
		 * @param comp
		 * @throws NegocioException
		 */
		public void salvar(Componente comp) throws NegocioException{
			
			
			
			/*verifica se o componente � nulo ou vasio*/
			if(comp == null || comp.equals("")){
				throw new NegocioException("Componente invalido ou nulo, verifique se todos os campos estao preenchidos");
			}
			/*verifica o nome do componente*/ 
			if(comp.getNomeComponente() == null || comp.getNomeComponente().equals("")){
				throw new NegocioException("Nome do componente invalido");
			}
			
			/*verifica se o nome do componente � v�lido*/
			if(!ValidacoesGerais.isNomeValid(comp.getNomeComponente())){
				throw new NegocioException("Este campo nao pode conter caracteres numericos nem especiais");
			}
			
			
			/*verifica se a atividade de um componente � nula ou vasia */
			if(comp.getAtividade() == null || comp.getAtividade().getcod_Atividade() <= 0 ){
				throw new NegocioException("Verifique a Atividade do Componente, nula ou vasia");
			}
			
			/*verifica se a sele��o de um componente � nula ou vasia*/
			if(comp.getSelecao() == null || comp.getSelecao().equals("")){
				throw new NegocioException("Verifique a Selecao do Componente, nula ou vasia");
			}
			
			
			/*tenta salvar um componente*/
			try {
				
				repcomp.salvar(comp);
			
			} catch (ConexaoException e) {
				
				throw new NegocioException("Verifique a conexao com o Banco de Dados "+e.getMessage());
			
			} catch (RepositorioException e) {
			
				throw new NegocioException("Erro ao Salvar um Componente "+e.getMessage());
			}
				
		}
		/**
		 * Valida o nome do componente e consulta
		 * @param nome
		 * @return
		 * @throws NegocioException
		 */
		public Componente consultar(String nome)throws NegocioException{
			
			Componente  comp = null;
			/*verifica se o nome n�o � nulo nem vasio*/
			if(nome == null  || nome.equals("")){
				throw new NegocioException("Nome do componente invalido");
			}
			
			/*verifica se o nome n�o comtem caracteres especias e num�ricos*/
			if(!ValidacoesGerais.isNomeValid(nome)){
				throw new NegocioException("Este campo nao pode conter caracteres numaricos nem especiais");
			}
			
			/*tenta consultar um Componente*/
			try {
				comp = repcomp.consultar(nome);
				
			} catch (ConexaoException e) {
				
				throw new NegocioException("Verifique a conexao com o Banco de Dados "+e.getMessage());
			
			} catch (RepositorioException e) {
			
				throw new NegocioException("Erro ao consultar um Componente"+e.getMessage());
			}
			
			return comp;
		}
		
		/**
		 * valida o nome do componente e exclui
		 * @param nome
		 * @throws NegocioException
		 */
		public void excluir(String nome)throws NegocioException{
			
			/*verifica se o nome n�o � nulo nem vasio*/
			if(nome == null || nome == "" || nome.equals(null) || nome.equals("")){
				throw new NegocioException("Nome do componente invalido");
			}
			
			/*verifica se o nome n�o comtem caracteres especias e num�ricos*/
			if(!ValidacoesGerais.isNomeValid(nome)){
				throw new NegocioException("Este campo nao pode conter caracteres numericos nem especiais");
			}
			
			try {
				repcomp.excluir(nome);
			
			} catch (ConexaoException e) {
				
				throw new NegocioException("Verifique a conex�o com o Banco de Dados "+e.getMessage());
			
			} catch (RepositorioException e) {
			
				throw new NegocioException("Erro ao exluir um Componente "+e.getMessage());
			}
			
		}
		/**
		 * Lista todos os componentes de uma determinada selecao
		 * 
		 * @author Esdras
		 * @param nome
		 * @return ArrayList<Componente>
		 * @throws NegocioException
		 */
		public Collection<Componente> listarPorSel(String nome)throws NegocioException{
			
			Collection<Componente> lista = new ArrayList<Componente>();
			/*verifica se o nome n�o � nulo nem vasio*/
			if(nome == null  || nome.equals("")){
				throw new NegocioException("Nome do componente inv�lido");
			}
			
			/*verifica se o nome n�o comtem caracteres especias e num�ricos*/
			if(!ValidacoesGerais.isNomeValid(nome)){
				throw new NegocioException("Este campo n�o pode conter caracteres num�ricos nem especiais");
			}
			
			/*tenta consultar um Componente*/
			try {
				lista = repcomp.listarPorSelecao(nome);
				
				
			} catch (ConexaoException e) {
				
				throw new NegocioException("Verifique a conex�o com o Banco de Dados "+e.getMessage());
			
			} catch (RepositorioException e) {
			
				throw new NegocioException("Erro ao consultar um Componente"+e.getMessage());
			}
			return lista;
		} 
		
}
